class Pagination(object):

    def __init__(self,current_page,all_count,base_url,params,per_page_num=8,pager_count=11,):
        """
        封装分页相关数据
        :param current_page: 当前页
        :param all_count:    数据库中的数据总条数
        :param per_page_num: 每页显示的数据条数
        :param base_url: 分页中显示的URL前缀
        :param pager_count:  最多显示的页码个数
        """

        try:
            current_page = int(current_page)
        except Exception as e:
            current_page = 1

        if current_page <1:
            current_page = 1

        self.current_page = current_page

        self.all_count = all_count
        self.per_page_num = per_page_num

        self.base_url = base_url

        # 总页码
        all_pager, tmp = divmod(all_count, per_page_num)
        if tmp:
            all_pager += 1
        self.all_pager = all_pager
        self.pager_count = pager_count  # 最多显示页码数
        self.pager_count_half = int((pager_count - 1) / 2)

        import copy
        '''
        深拷贝，只是把原来的对象复制一份单独存在，原对象的该表不会对深拷贝的对象产生影响
        params 是 request.GET 得到的值，所属的数据类型为 QueryDict，该数据类型在默认情况下为制度的字典类型，修改其 _mutabel 静态变量可以使该数据类型修改成为可写的数据类型
        '''
        params=copy.deepcopy(params)
        params._mutable = True
        # 将实例化类对象的 params 参数传给 当前类的静态变量
        self.params = params

    @property
    def start(self):
        return (self.current_page - 1) * self.per_page_num

    @property
    def end(self):
        return self.current_page * self.per_page_num

    def page_html(self):
        # 如果总页码 < 11个：
        if self.all_pager <= self.pager_count:
            pager_start = 1
            pager_end = self.all_pager + 1
        # 总页码  > 11
        else:
            # 当前页如果<=页面上最多显示(11-1)/2个页码
            if self.current_page <= self.pager_count_half:
                pager_start = 1
                pager_end = self.pager_count + 1

            # 当前页大于5
            else:
                # 页码翻到最后
                if (self.current_page + self.pager_count_half) > self.all_pager:
                    pager_start = self.all_pager - self.pager_count + 1
                    pager_end = self.all_pager + 1

                else:
                    pager_start = self.current_page - self.pager_count_half
                    pager_end = self.current_page + self.pager_count_half + 1

        page_html_list = []
        self.params["page"]=1
        '''
        功能：
            首页的实现
        知识点：
            urlencode() 方法可以使 {"a":1,"b""2} 的 URL参数 转换成你 a=1&b=2 的格式
        '''
        first_page = '<li><a href="%s?%s">首页</a></li>' % (self.base_url,self.params.urlencode(),)
        page_html_list.append(first_page)
        '''
        功能：
            上一页的实现
        '''
        if self.current_page <= 1:
            prev_page = '<li class="disabled"><a href="#">上一页</a></li>'
        else:
            self.params["page"] = self.current_page-1
            prev_page = '<li><a href="%s?%s">上一页</a></li>' % (self.base_url,self.params.urlencode(),)

        page_html_list.append(prev_page)
        # 生成每一个的分页页码标签
        for i in range(pager_start, pager_end):
            # i 指的是每个分页标签对应的页码
            self.params["page"] = i
            # 当前URL参数中的page value与生成标签的页码相等时，则让标签变成蓝色，否则不变蓝
            if i == self.current_page:
                temp = '<li class="active"><a href="%s?%s">%s</a></li>' % (self.base_url,self.params.urlencode(), i,)
            else:
                temp = '<li><a href="%s?%s">%s</a></li>' % (self.base_url, self.params.urlencode(),i,)
            page_html_list.append(temp)
        # 当前URL参数的页码大于等于总共的页码数时，则让"下一页"标签处于disable状态,否则使下一页页码正常显示
        if self.current_page >= self.all_pager:
            next_page = '<li class="disabled"><a href="#">下一页</a></li>'
        else:
            self.params["page"] = self.current_page+1
            next_page = '<li><a href="%s?%s">下一页</a></li>' % (self.base_url,self.params.urlencode(),)
        page_html_list.append(next_page)
        '''
        功能:
            尾页的实现
        '''
        self.params["page"]=self.all_pager
        last_page = '<li><a href="%s?%s">尾页</a></li>' % (self.base_url,self.params.urlencode(),)
        page_html_list.append(last_page)

        return ''.join(page_html_list)